﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>

using namespace std;

//class A
//{
//public:
//  void f() { cout << "A::f()" << endl; }
//  int a;
//};
//
//
//
//class B : public A
//{
//public:
//	void f(int a) { cout << "B::f()" << endl; }
//	int a;
//};
//
//
//
//int main()
//{
//	B b;
//	b.A::f();
//	return 0;
//}


//class Student
//{
//public:
//	void identity()
//	{
//		// ...
//	}
//
//	void study()
//	{
//		// ...
//	}
//protected:
//	string _name = "peter"; // 姓名 
//	string _address; // 地址 
//	string _tel; // 电话 
//	int _age = 18; // 年龄 
//	int _stuid; // 学号 
//};
//
//class Teacher
//{
//public:
//	void identity()
//	{
//		// ...
//	}
//
//	void teaching()
//	{
//		//...
//	}
//protected:
//	string _name = "张三"; // 姓名 
//	int _age = 18; // 年龄 
//	string _address; // 地址 
//	string _tel; // 电话 
//	string _title; // 职称 
//};

////父类
//class person
//{
//public:
//	void identiry()
//	{
//		// ...
//	}
//
//protected:
//	string _name;
//	int _age;
//	string _address;
//	string _tel;
//};
//
////子类
//class student : public person
//{
//public:
//	void study()
//	{
//		// ...
//	}
//
//protected:
//	int _id;//学号
//};
//
////子类
//class teacher : public person
//{
//public:
//	void teaching()
//	{
//		// ...
//	}
//
//protected:
//	int _title;//职称
//};
//
//int main()
//{
//	return 0;
//}


//class A
//{
//protected:
//	int _c;
//
//private:
//	int _a;
//};
//
//class B :public A
//{
//private:
//	int _b;
//};
//
//int main()
//{
//	B b;
//
//	return 0;
//}

//#include <vector>
//#include <list>
//#include <deque>
//
//#define CONTAINER std::vector<T>
////#define CONTAINER std::list<T>
////#define CONTAINER std::deque<T>
//
//namespace xsc
//{
//	template<class T>
//	class stack : public CONTAINER
//	{
//	public:
//		void push(const T& x)
//		{
//			CONTAINER::push_back(x);
//			//push_back(x);
//		}
//		void pop()
//		{
//			CONTAINER::pop_back();
//		}
//		const T& top()
//		{
//			return CONTAINER::back();
//		}
//		bool empty()
//		{
//			return CONTAINER::empty();
//		}
//	};
//}
//int main()
//{
//	xsc::stack<int> st;
//	st.push(1);
//	st.push(2);
//	st.push(3);
//	while (!st.empty())
//	{
//		cout << st.top() << " ";
//		st.pop();
//	}
//	return 0;
//}

//template<typename T>
//class A
//{
//public:
//	void add(const T& x)
//	{
//		func();
//	}
//};
//
//int main()
//{
//	A<int> aa;
//
//	return 0;
//}


//class Person 
//{
//	virtual void func()
//	{
//		cout << "func()" << endl;
//	}
//
//public:
//	string _name = "李四";
//	string _sex;
//	int _age;
//};
//
//class Student : public Person 
//{
//public:
//	int _No;
//};
//
//int main()
//{
//	Student sobj;
//
//	
//
//	/*Person pobj = sobj;
//	Person* pp = &sobj;
//	Person& rp = sobj;
//
//	cout << sobj._name << endl;
//
//	rp._name = "张三";
//	cout << rp._name << endl;
//	cout << sobj._name << endl;*/
//
//	//2.父类对象不能赋值给子类对象，这里会编译报错
//	
//	/*Person pobj;
//	sobj = pobj;
//	sobj = (Student)pobj;*/
//
//
//	int i = 0;
//	//double& j = i;
//	const double& j = i;
//
//	Person* pp;
//
//	//Student* ps1 = pp; //直接转换是不行的
//	Student* ps1 = dynamic_cast<Student*>(pp);
//
//	cout << ps1 << endl;
//
//	//pp = &pobj;
//	//Student* ps2 = dynamic_cast<Student*>(pp);
//	//cout << ps2 << endl;
//
//	return 0;
//}

//
//class person
//{
//protected:
//	int num = 1;
//	string name = "张三";
//};
//
//class student :public person
//{
//public:
//	void print()
//	{
//		cout << num << endl;
//		cout << person::num << endl;
//	}
//
//protected:
//	int num = 999;
//	string name = "李四";
//};
//
//
//int main()
//{
//	person p;
//	student s;
//	s.print();
//
//	return 0;
//}


//class A
//{
//public:
//	void func(int i)
//	{
//		cout << "A::func()" << endl;
//	}
//};
//
//class B : public A
//{
//public:
//	void func()
//	{
//		cout << "B::func()" << endl;
//	}
//};
//
//int main()
//{
//	A a;
//	B b;
//
//	b.func(1);
//
//	return 0;
//}


//class A
//{
//public:
//	void fun()
//	{
//		cout << "func()" << endl;
//	}
//};
//class B : public A
//{
//public:
//	void fun(int i)
//	{
//		cout << "func(int i)" << i << endl;
//	}
//};
//int main()
//{
//	B b;
//	b.fun(10);
//	b.fun();
//
//	return 0;
//};


//class person
//{
//public:
//	/*person()
//		:_name("jake")
//		,_age(18)
//	{}*/
//
//	person(const char* s,int a)
//		:_name(s)
//		,_age(a)
//	{}
//
//	person(const person& p)
//		:_name(p._name)
//		,_age(p._age)
//	{}
//
//	person& operator=(const person& p)
//	{
//		if (this != &p)
//		{
//			_name = p._name;
//			_age = p._age;
//		}
//		return *this;
//
//	}
//
//	~person()
//	{
//		cout << "~person" << endl;
//	}
//
//protected:
//	string _name;
//	int _age;
//};
//
//class student : public person
//{
//public:
//	student(const char* s = "mike", int a = 1)
//		:person(s,a)
//		,_NO("001")
//	{}
//
//	student(const student& s)
//		:person(s)
//		,_NO(s._NO)
//	{}
//
//	student& operator=(const student& s)
//	{
//		if (this != &s)
//		{
//			person::operator=(s);
//			_NO = s._NO;
//		}
//		return *this;
//
//	}
//
//	~student()
//	{
//		person::~person();
//		cout << "~student" << endl;
//	}
//
//protected:
//	string _NO;
//};
//
//int main()
//{
//	/*student s("jake",29);
//	student s1 = s;
//	student s2;
//	s2 = s;*/
//
//	student s;
//
//	return 0;
//}


//class base final
//{
//protected:
//	int _a;
//	string _name;
//};
//
//class A : public base
//{
//
//};
//
//int main()
//{
//
//	return 0;
//}

//class student;
//
//class person
//{
//	friend void print(const person& p, const student& s);
//
//protected:
//	string _name;
//	int _age;
//};
//
//class student :public person
//{
//	friend void print(const person& p, const student& s);
//
//protected:
//	string _NO;
//};
//
//
//void print(const person& p, const student& s)
//{
//	cout << p._name << " " << p._age << endl;
//	cout << s._NO;
//}
//
//int main()
//{
//	student s;
//
//	return 0;
//}

//
//class A
//{
//public:
//	static int _d;
//	string _name;
//};
//
//int A::_d = 0;
//
//class B :public A
//{
//public:
//	string _gender;
//};
//
//int main()
//{
//	A a;
//	B b;
//
//	//对于非静态成员来说，每个基类/派生类的对象都有一份属于自己的
//	//地址不同
//	cout << &a._name << endl;
//	cout << &b._name << endl << endl;
//
//	//对于静态成员来说，基类和其所有的派生类中都只有一份，由其产生的对象也都公有那一份
//	//地址相同
//	cout << &a._d << endl;
//	cout << &b._d << endl << endl;
//
//	cout << A::_d << endl;
//	cout << B::_d << endl;
//
//	A::_d++;
//	B::_d++;
//
//	cout << a._d << endl;
//	cout << b._d << endl;
//
//	return 0;
//}


//class Person
//{
//public:
//	string _name; // 姓名 
//};
//
//class Student : virtual public Person
//{
//protected:
//	int _num; //学号 
//};
//
//class Teacher : virtual public Person
//{
//protected:
//	int _id; // 职⼯编号 
//};
//
//class Assistant : public Student, public Teacher
//{
//protected:
//	string _majorCourse; // 主修课程 
//};
//
//int main()
//{
//	Assistant as;
//	as._name = "bird";
//
//	/*as.Student::_name = "bird";
//	as.Teacher::_name = "fly";*/
//
//	return 0;
//}


class Base1 { public: int _b1; };
class Base2 { public: int _b2; };
class Derive : public Base1, public Base2 { public: int _d; };

int main()
{
	Derive d;
	Base1* p1 = &d;
	Base2* p2 = &d;
	Derive* p3 = &d;

	return 0;
}
